package com.atguigu.lease.common.util;

import com.atguigu.lease.common.exception.StgyException;
import com.atguigu.lease.common.result.ResultCodeEnum;
import com.atguigu.lease.model.entity.SystemUser;
import com.atguigu.lease.model.entity.UserInfo;
import io.jsonwebtoken.*;
import io.jsonwebtoken.impl.DefaultClaims;
import jakarta.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtil {
    private JwtUtil(){

    }

    public static String createToken(SystemUser systemUser, HttpServletRequest request){
        //练习： 将构建jwt的所有的硬编码的属性值 抽取为配置常量
        return Jwts.builder()
                //header：
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS256")
                //payload： 存放主要数据
                // payload: jwt配置
                .setExpiration(new DateTime().plusDays(3).toDate()) //过期时间: 3天后过期
                .setSubject("stgy-admin-token") //主题
                .setIssuedAt(new Date())//颁发时间 没用
                // payload: 自定义数据
                .claim("userId", systemUser.getId())
                .claim("name", systemUser.getName())
                .claim("userName", systemUser.getUsername())
                .claim("avatar", systemUser.getAvatarUrl())
                //解析客户端请求对象中的ip地址使用
                .claim("ip", IpUtils.getIpAddr(request))
                //sign ： 签名
                .signWith(SignatureAlgorithm.HS256, "atguigu") //指定加密算法 和密钥(要保证安全  不能泄漏)
                .compact();
    }

    public static Map<String,Object> parseToken(String token, HttpServletRequest request){
        //得到载荷
        DefaultClaims claims = getPayLoad(token);
        //获取使用token获取用户信息的客户端的ip地址
        String ipAddr = IpUtils.getIpAddr(request);
        //获取登录时创建token的客户端的ip地址
        String ip = claims.get("ip", String.class);
        if(!ipAddr.equals(ip)){
            throw new StgyException(ResultCodeEnum.ILLEGAL_REQUEST);
        }

//        String avatar = claims.get("avatar", String.class);
//        String name = claims.get("name", String.class);
//        String userName = claims.get("userName", String.class);
//        Long userId = claims.get("userId", Long.class);

//        SystemUser systemUser = new SystemUser();
//        systemUser.setAvatarUrl(avatar);
//        systemUser.setId(userId);
//        systemUser.setName(name);
//        systemUser.setUsername(userName);
//        Map<String,Object> map = new HashMap<>();
//        map.put()
        return claims;
    }
    //校验token是否合法的业务： 如果token过期 或者被篡改 返回false
    public static boolean checkToken(String token){
        try {
            DefaultClaims body = (DefaultClaims) Jwts.parser()
                    //设置解析token的密钥
                    .setSigningKey("atguigu")
                    //解析jwttoken
                    .parse(token)
                    .getBody();
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    public static DefaultClaims getPayLoad(String token){
        return  (DefaultClaims) Jwts.parser()
                //设置解析token的密钥
                .setSigningKey("atguigu")
                //解析jwttoken
                .parse(token)
                .getBody();
    }

    public static String createToken(UserInfo userInfo, HttpServletRequest request) {
        //练习： 将构建jwt的所有的硬编码的属性值 抽取为配置常量
        return Jwts.builder()
                //header：
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS256")
                //payload： 存放主要数据
                // payload: jwt配置
                .setExpiration(new DateTime().plusDays(3).toDate()) //过期时间: 3天后过期
                .setSubject("stgy-admin-token") //主题
                .setIssuedAt(new Date())//颁发时间 没用
                // payload: 自定义数据
                .claim("userId", userInfo.getId())
                .claim("userName", userInfo.getNickname())
                .claim("avatar", StringUtils.isEmpty(userInfo.getAvatarUrl())?"https://www.kubesphere.io/images/header/logo.svg":userInfo.getAvatarUrl())
                //解析客户端请求对象中的ip地址使用
                .claim("ip", IpUtils.getIpAddr(request))
                //sign ： 签名
                .signWith(SignatureAlgorithm.HS256, "atguigu") //指定加密算法 和密钥(要保证安全  不能泄漏)
                .compact();
    }
}
